AVReAl | Описание | Адаптеры | History | FAQ | English | Russian |
Программа компилируется в следующих вариантах
W95/W98 | - DLportIO.DLL |
NT4,W2000,WinXP | - DLportIO.DLL и DLportIO.sys |
Это файлы из комплекта DriverLINX от Scientific Software Tools, Inc.
(http://www.sstnet.com). С некоторых пор
этот драйвер перестал поддерживаться и исчез с основной страницы фирмы.
В
сокращённом виде без описания и множественных примеров применения можно взять
тут dlportio.zip
(170KB).
В некоторых случаях могут быть проблемы с установкой сокращённой
версии под WinXP (возможно, начиная с какого-то сервис-пака, так как под
WinXPsp1 нормально устанавливался и сокращённый вариант). В таком случае следует
взять полную версию
инсталлятора (1.5МБ).
Применение WIN32 версии фактически имеет смысл только
под NT, Win2000, WinXP, когда DOS-программа не имеет доступа к портам. Под
W95/W98 нормально работает и DOS-версия.
Программа AVReAl предназначена для программирования микроконтроллеров серии AVR фирмы Atmel в режиме ISP (in-cirсuit serial programming, последовательное программирование в схеме). Т.е. на плату устройства устанавливаются штыри, к которым впоследствии подключается шлейфик от программатора (подключение LPT к контроллеру рассмотрено в разделе "адаптеры"). По окончании процесса программирования снимается сигнал сброса и процессор начинает выполнять зашитую в него программу.
В режиме "fbprg" незадействованные выходы данных LPT могут быть использованы как питание (ключ -ap).
При использовании буферированных адаптеров (Altera ByteBlaster, Atmel STK*00) программа рассчитана на шитьё в плате с "родными" питанием и кварцем.
Также возможна генерация XTAL программой (ключ -o0), данный режим может оказаться полезен и при наличии кварца в плате (LPT-порт легко его пересилит) для "обхода" ошибок кристалов "не читается содержимое EEPROM данных при частотах кварца, близких к максимальной".
Принимает INTEL HEX (avrasm -i). Загружает HEX в память не в массив, а в список. Т.е. различается ситуация "байт 0xFF в .hex" и "неупомянутый байт" В результате есть возможность шить только то, что надо, остальное только проверять при необходимости (см. ключ -v+).
Для любителей корректировать прошивку прямо по HEX-файлу: если не совпадает
контрольная сумма строки, то задается вопрос - "игнорировать?". При ответе 'Y'
(или 'y') эта и все остальные ошибки CSUM игнорируются (но сами символы
контрольной суммы должны присутствовать, иначе программа закончит работу еще
раньше по недопустимому символу в строке).
Для облегчения такого
редактирования (особенно "форматных" записей в EEPROM) реализована возможность,
подсмотренная у программы от VMK для программирования PIC через Tait-совместимое
железо: перед анализом строки из нее убираются пробелы и табуляции. В итоге
можно дать:
:08 0001 00 00 01 0203 0405 0 6 0 7 DBТакже игнорируются пустые строки и строки, начинающиеся с символа '#', последнее предназначено для помещения комментариев о версии непосредственно в HEX-файлы.
Проверяется верхний адрес в HEX-файле, если не влазит в опознанный кристалл,
то никаких действий (кроме выдачи сообщения об ошибке) не производится.
Проверяется перекрытие адресов записей в HEX файле. При нахождении первого
перекрытия производится выход из программы с указанием диапазона адресов
перекрывающихся данных.
Для кристаллов с объёмом ПЗУ более 64KB необходим расширенный формат HEX-файла (обычный не поддерживает объем больше 64KB). Запись прочитанных данных в файл всегда производится с дополнительными записями тип '04' - Extended Linear Address Record, как не имеющим разночтений. Чтение из HEX-файла записей типа '02' Extended Segment Address Record производится в соответствии с формированием их в AVRASM by Atmel (без предусмотренного документацией Intel сворачивания адреса смещения по модулю 64Kb).
avreal [ключи] [[-c] имя_файла_кода [[-d] имя_файла_данных]] или avreal [ключи] -d имя_файла_данных (когда код трогать желания нет)Если есть только имена файлов, но нет относящихся к ним ключей (-r -w -v), то файлы игнорируются. Подробнее про работу с файлами и про ключи -c, -d рассказано после описания остальных ключей.
Ключи
-h (-?)
avreal +имя -h(
+имя
должен быть задан
раньше ключа -h) выдает список fuses, поддерживаемых в режиме ISP для
заданного контроллера. +имя
имя
допускается задавать как
с префиксом 'AT', так и без него, в том виде, в котором имена выдаются по
-h. Регистр букв не важен. Например, at90s1200, attiny22l,
atmega103
либо 90s1200, tiny22l, mega103
. Обязательный
ключ, никаких действий по умолчанию не производится. Если задан только тип
(больше нет ни ключей, ни имен файлов), то контроллер будет сброшен и выдана
информация о нем (наличие, если есть доступные по ISP fuses - их состояние).
-p<порт>[,<скорость>]
порт
-p3BC
, и в виде
-p0x3BC
воспринимается как шестнадцатеричное число. По
умолчанию -p2 (LPT2)/dev/ppi0
скорость
необязательный параметр, число с плавающей
точкой, время обращения к порту в микросекундах.
Hz, kHz,
MHz,
например,-o3.686MHZ -o14745600hz
-e -w -n
если
последние 2 байта заняты кодом, то -n игнорируется. <fuselist>
выглядит как
fusename=value,fusename=value,bytename=value...
где value -
ШЕСТНАДЦАТЕРИЧНОЕ значение без префиксов и суффиксов. Для однобитовых fuse
добавлены значения ON и OFF (прошить и стереть, 0 и 1
соответственно).name=val
выдается сообщение об ошибке. Перечень fusename для
конкретного кристалла с диапазоном value и комментарием можно получить при
помощи avreal +chipname -?Для сокращения строки возможно задание полного байта fuses при помощи специальных имен bytename, представляющие собой названия байтов по документации с лидирующим подчерком:
_low,_high,_ext,_lock
. Нереализованные в данном байте биты
рекомендуется устанавливать в '1'. Имя _lock
относится к байту
lock-битов и BLB, однако на состояние lock-битов не влияет. Для
блокировки кристалла по прежнему надо использовать ключ -l. Допускается
комбинация отдельных fuse и байтов, однако они при этом не должны
пересекаться, т.е. каждый байт fuses должен быть задан либо только через
специальное имя, либо только через имена отдельных fuse. Например, допустимо: -f_low=C3,_high=F4,blb2=1 недопустимо: -f_lock=F7,blb2=1Если работа с fuses по SPI поддерживается, то их состояние сообщается при любой операции с кристаллом, задание ключа -f необязательно. Fuses программируются или верифицируются указанием ключа -w или -v совместно с ключом -f (в том числе в одном сеансе с программированием/верификацией кода или данных).
-e
независимо от ключа -f
). Группа BLB относится скорее к
lock-битам, записать 1 поверх уже запрограммированной в 0 fuse невозможно.
Если запрошена такая операция и контроллер не стирался, то программа завершает
работу с соответствующим предупреждением. -fspien=1 (-fspien=off)
сотрет
SPIEN и запретит дальнейшее низковольтное программирование. То же произойдет и
при программировании RSTDSBL (-frstdsbl=0 или
-frstdsbl=on
). +name
) а также если не обнаружен
указанный в командной строке адаптер. Попытка стереть нераспознанный (возможно
просто залоченный) кристалл при наличии команды стирания производится и без
-!, после чего проводится повторное детектирование типа. возможны осмысленные комбинации:
-v -w записать, проверить -e- -w -v+ стереть с сохранением EEPROM, записать, верифицировать с проверкой на чистоту свободных участков. -b -w проверить на чистоту, если грязная - выход, иначе писатьВНИМАНИЕ! в связи с усложнением форматов ключей во избежание разночтений в дальнейшем возможность указывать группу ключей одним аргументом (например, -ewv) может быть исключена
Порядок ключей не важен, выполнение производится в порядке E B W V L. Если проверка (B, V) дала отрицательный результат, то дальнейшая работа не производится. Т.е.
-e -b -w -v -l2означает: стереть, если стёрлось - писать, если верифицировалась - залочить.
+tiny12 -w -c foo.hex -c*osccal=1f3 -fcksel=3,boden=0Для tiny12 записать во флеш кода файл foo.hex, по адресу байта 0x1F3 занести прочитанное из контроллера значение OSCCAL, запрограммировать fuse boden и установить fuse CKSEL в бинарное значение 0011
-d*name=offset,ext
- как байты в EEPROM данных
-c*name=offset,ext
- как байты во FLASH кода (под команду LPM)
-с?name=offset,ext
- как часть последовательных команд LDI
начиная с offset где
name
offset
ext
Значение калибровочного байта RC-генератора
В качестве имени
используется слово osccal
с номером калибровочного байта. При
использовании нулевого байта OSCCAL указание номера 0 не обязательно.
Дополнительный аргумент ext
- корректирующее значение к прочитанной
из кристалла величине OSCCAL (может быть необходимо при напряжении питания,
отличающемся от напряжения калибровки на производстве). При выходе
корректированного значения за пределы [0..255] происходит ограничение значения и
выдача предупреждения.
Примеры.
1. Необходимо записать значение 3-го
(считая с 0) байта osccal как байт по адресу 0x3F в EEPROM данных. Используется
ключ
-d*osccal3=3F2. Необходимо записать значение 0-го байта osccal, уменьшенное на 3, как часть команды LDI.
public osccal_ldi ... osccal_ldi: ldi R16,0xFF out OSCCAL,R16 ...Далее смотрим по MAP-файлу значение
osccal_ldi
, например оно
вышло 0x120. Команда примет вид: avreal +tiny12 -ewv -c foo.hex -c?osccal=120,-3
serno
с числом - длиной
номера в байтах от 1 до 4. Серийный номер записывается в двоичном виде, младший
байт записывается первым. Дополнительный аргумент ext
- имя
текстового файла, в котором записан номер в десятичном виде. После успешной
записи в кристалл номер увеличивается на 1 и записывается назад в файл. Файл при
этом переписывается полностью, если после серийного номера в нём была другая
информация - она теряется. При сбое верификации при команде -w -v номер
не меняется. Если в командной строке задана только верификация (без записи), то
значение серийного номера из файла используется, но не инкрементируется, файл
остаётся без изменений. -d*serno2=12,serno.txt2. Необходимо записать значение 3-байтового серийного номера как часть команд LDI. Номер записан в файле proj.serno
public serno_load ... serno_load: ldi R16,0xFF ; младший байт ldi R17,0xFF ; средний байт ldi R18,0xFF ; старший байтПусть значение
serno_load
по map-файлу вышло 0x120.
Используется ключ: -c?serno3=120,proj.serno
Произвольная последовательность
байтов
Предназначено для записи произвольных данных. В качестве имени
параметра используется слово bytes
с числом записываемых байтов.
Дополнительный аргумент ext
- шестнадцатеричная строка, число букв
(hex-цифр) должно быть равно удвоенному числу байтов. Младший байт в hexstr
должен быть расположен первым, т.е. для записи числа 0xDEADBEEF
надо задать
-c*bytes4=addr,EFBEADDE
Файл конфигурации позволяет задать соответствие сигналов ISP-программатора
выводам LPT-порта, а также название адаптера, используемое при выводе
диагностических сообщений. Файл состоит из отдельных записей вида параметр
= значение
по одной на строке.
Название адаптера (параметр 'name') задаётся записью
name = "произвольная строка"Сигналы программатора (параметры mosi, miso, sck, reset, xtal) задаются записями вида
signal_name = [~]lpt_pin_nameПризнак инверсии '~' означает, что между выводом LPT и выводом микроконтроллера присутствует инвертор. Внутренняя инверсия контроллера LPT учитывается автоматически. Допустимые имена выводов LPT: d0..d7 alf init strobe select ask busy error pe online. Внимание! В настоящее время для выходных сигналов программатора можно использовать только выводы d0..d7 порта LPT.
Существуют специальные группы выводов set, power, enable, в записях для этих групп допускается перечисление нескольких выводов LPT через запятую. Признак инверсии при каждом выводе означает, что на вывод необходимо выдать низкий уровень. Перед началом работы в заданное (активное) состояние устанавливаются выводы группы set. Затем активируются выводы группы power, выдерживается пауза около 0.3секунды и активируются выводы enable. По окончании работы в пассивное состояние переводятся выводы enable, затем выводы power. Выводы set остаются в установленном в начале состоянии.
Примеры описания адаптера для системы, состоящей из двух микроконтроллеров AVR, связанных между собой по SPI. Пусть контролеры соединены следующим образом:
При высокоимпедансном состоянии адаптера программирования или его отсутствии контроллеры могут свободно обмениваться информацией по последовательному интерфейсу.
Для программирования первого микроконтроллера необходимо использовать следующий конфигурационный файл.
name=1'st controller programmer mosi=D6 miso=BUSY sck = D0 reset = D1 enable=~ALF set =~D3Для программирования второго контроллера конфигурация адаптера должна быть следующая.
name=2'nd controller programmer mosi=D6 miso=BUSY set = ~D0 reset = D1 enable=~ALF sck = D3
Раздел "СВЕТЛОЕ БУДУЩЕЕ" убран в силу нехватки времени и изменения моих собственных потребностей. Коммунизм нам тоже когда-то обещали к 80 году, так что лучше я ничего обещать не буду, а вот если что-то интересное смогу, то будет сюрприз :-)
P.S. При обнаружении неприятностей просьба сообщать версию и очень
желательно копию расширенной выдачи программы по -% (перенаправив выдачу в
файл).
Внимание!!! Письма по поводу avreal с аттачами
в виде скриншотов, WORD-овских и прочеофисовских документов и других способов
переслать 1-килобайтный текст с помощью 100-килобайтного файла не будут даже
читаться, не говоря уже об ответах